// 集群如何实现的？
// 多个进程监听同一个端口 不会导致端口重用吗
// 内部是如何实现控制负载均衡  （默认采用轮训， window比较特殊）

// 1.实现的时候 内部创建子进程用的是fock
// 2.如何判断是子进程还是父进程的  内部会使用NODE_UNIQUE_ID这个标识， 如果有这个值则是子进程 否则是父进程
// 3.node中创建服务时 会调用listen方法，那么这个listen方法会方法listenInCluster，并不会创建多个服务，只是创建多个处理函数，父亲会创建一个服务，然后分发给各个函数
// 4.创建服务时会判断，如果是主进程直接就正常的创建服务，如果是子进程那么不能去创建真实的服务，因为会导致端口重复占用， 
//   子进程会将创建的信息传递给父进程让父进程创建一个应用 ， 稍后请求到来的时候会访问到主应用中，主应用在分配给每个子进程  (只是起了一个服务，之后主进程将任务分配给每个子进程)


const cluster = require('cluster'); // 多个人做同一件事  多个进程 
const http = require('http')
const path = require('path');
const cpus  = require('os').cpus()

if(cluster.isMaster){ // 默认执行肯定是主进程
    for(let i = 0 ; i < cpus.length;i++){
        cluster.fork(); // child_process.fork
    }
}else{
    // 调用fork的时候 会默认让此文件再次执行 但是这时候isMaster为false
    const server = http.createServer((req,res)=>{  
        res.end('child'+ process.pid)
    })
    server.listen(4000); // 不是同一个服务 被监听多次，而是只有一个服务，负责分发
}


// pm2 进程管理

// npm install pm2 -g
// pm2 start 1.server.js --name xxx
// pm2 restart 1.server.js / pm2 restart xxx
// pm2 stop 编号
// pm2 list # 显示进程状态
// pm2 kill # 杀死全部进程
// pm2 delete 0
// pm2 start 1.server.js --watch 监控文件变化
// pm2 logs 可以查看日志 
// pm2 start 1.server.js -i max


// 初始化配置文件 pm2 init 可以初始化配置文件  cluster:4


// 4.1 安装pm2
// npm install pm2 -g # 安装pm2
// pm2 start server.js --watch -i max # 启动进程
// pm2 list # 显示进程状态
// pm2 kill # 杀死全部进程
// pm2 start npm -- run dev # 启动npm脚本
// #4.2 pm2配置文件
// pm2 ecosystem
// 配置项目自动部署

// module.exports = {
//   apps : [{
//     name: 'my-project',
//     script: 'server.js',
//     // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
//     args: 'one two',
//     instances: 2,
//     autorestart: true,
//     watch: false,
//     max_memory_restart: '1G',
//     env: {
//       NODE_ENV: 'development'
//     },
//     env_production: {
//       NODE_ENV: 'production'
//     }
//   }],
//   deploy : {
//     production : {
//       user : 'root',
//       host : '39.106.14.146',
//       ref  : 'origin/master',
//       repo : 'https://github.com/wakeupmypig/pm2-deploy.git',
//       path : '/home',
//       'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
//     }
//   }
// };
// pm2 deploy ecosystem.config.js production setup # 执行git clone
// pm2 deploy ecosystem.config.js production # 启动pm2